package com.qingke.easyjava.jdbc.command.impl;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.regex.Pattern;
import org.apache.commons.codec.digest.DigestUtils;
import com.qingke.easyjava.jdbc.app.BeSuperApplication;
import com.qingke.easyjava.jdbc.app.BeSuperDao;
import com.qingke.easyjava.jdbc.command.SystemCommand;
import com.qingke.easyjava.jdbc.pojo.Player;
import com.qingke.easyjava.jdbc.util.QingkeConsole;

public class SignCommand extends SystemCommand  {//继承父类执行。SystemCommand ->实现接口 Command 中的执行。                                                                                                                                                              
	

    @Override
    public void execute() {//执行。
        BeSuperDao dao = new BeSuperDao();	
        //三、为了调用方法

        String username = QingkeConsole.askUserInput("请输入用户名");	//传入打印。
        //检查用户名
        while (dao.isUsernameExists(username)) {						// 四、
            QingkeConsole.println("用户名已存在！");
            username = QingkeConsole.askUserInput("请输入用户名");
        }
        
        String password = null;
        while (true) {
            password = QingkeConsole.askUserInput("请输入密码");
            try {
        // 验证密码    validatePassword
                validatePassword(password);
                break;
            } catch (Exception e) {
                QingkeConsole.println("密码格式不对！" + e.getMessage());
                continue;
            }
        }
        
        String name = QingkeConsole.askUserInput("请输入昵称");

        Player player = dao.signup(username, password, name);			// 一、将昵称、密码、用户名发送给数据库。
        BeSuperApplication.getInstance().setPlayerProfile(player);		// 二、表示登录状态。只在登陆状态使用。
    }
    
    
    private void validatePassword(String password) throws Exception {	//捕获异常。
        // 1. length >= 6
        Pattern lenPattern = Pattern.compile("[0-9a-zA-Z]{6,}");		//正则表达式编译形式。
        if (!lenPattern.matcher(password).find()) {						//Pattern.matcher创建匹配给定输入与此模式的匹配器, matcher.find方法尝试查找与该模式匹配的输入序列的下一个子序列。 
            throw new Exception("密码长度必需大于等于6位");
        }
        
        // 2. not all number
        Pattern numPattern = Pattern.compile("[0-9]");
        if (!numPattern.matcher(password).find()) {
            throw new Exception("密码至少需要含有一位数字");
        }
        
        // 3. not all word
        Pattern wordPattern = Pattern.compile("[a-zA-Z]");
        if (!wordPattern.matcher(password).find()) {
            throw new Exception("密码至少需要含有一位字母");
        }
    }
}
//一、
/*    public Player signup(String username, String password, String nickname) {
        String sql = "INSERT INTO `player`.`player` (`name`, `username`, `password`) VALUES (?,?,?)";

        Connection conn = null;
        PreparedStatement statement = null;

        try {
            conn = getConnection();
            statement = conn.prepareStatement(sql);

            statement.setString(1, nickname);
            statement.setString(2, username);
            statement.setString(3, DigestUtils.md5Hex(password));
            
            int affectRows = statement.executeUpdate();
            
            if (affectRows > 0) {
                return login(username, password);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            cleanup(conn, statement, null);
        }

        return null;
    }*/

//二、
/*public void setPlayerProfile(Player player) {
        this.playerProfile = player;
    }*/




//    三
/*    public Player signup(String username, String password, String nickname) {
        String sql = "INSERT INTO `player`.`player` (`name`, `username`, `password`) VALUES (?,?,?)";

        Connection conn = null;
        PreparedStatement statement = null;

        try {
            conn = getConnection();
            statement = conn.prepareStatement(sql);

            statement.setString(1, nickname);
            statement.setString(2, username);
            statement.setString(3, DigestUtils.md5Hex(password));// DigestUtils.md5Hex 将commons-codec-1.3jar加入项目，传入参数，对参数进行加密。
            
            int affectRows = statement.executeUpdate();		//executeUpdate() 中的数必须是一个可以insert ,update ,delete语句。
            												//(1) SQL 数据操作语言 (DML) 语句的行数 (2) 对于无返回内容的 SQL 语句，返回 0 ，返回匹配行。
            
            if (affectRows > 0) {
                return login(username, password);	//将数值传给login用于，注册后直接登录。
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            cleanup(conn, statement, null);
        }

        return null;
    }*/

//四、
/*public boolean isUsernameExists(String username) {
        String sql = "select * from player where username = ?";
        
        Connection conn = null;
        PreparedStatement statement = null;
        ResultSet rs = null;

        try {
            conn = getConnection();
            statement = conn.prepareStatement(sql);

            statement.setString(1, username);
            
            rs = statement.executeQuery();
            
            if (rs.next()) {
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        } finally {
            cleanup(conn, statement, rs);
        }

        return false;
    }*/

/* private Connection getConnection() throws SQLException{
//        com.mysql.jdbc.Driver.class.getName();

        String driver = "com.mysql.jdbc.Driver";
        String url="jdbc:mysql://localhost:3306/player?useSSL=false";
        String username = "root";
        String password = "xyaychA153813";

        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }

        Connection conn = DriverManager.getConnection(url, username, password);
        return conn;
    }*/